#include "expr.h"
#include "visitor.h"
#include "opcode.h"
#include <iostream>

using namespace std;

Expr::Expr(){

}

Expr::~Expr(){

}


void Expr::accept(Visitor* v){
    v->visitExpr(*this);
}

VariableExpr::VariableExpr(const char *var){
    name = new string(var);
    varSym = 0;
}

VariableExpr::~VariableExpr(){
    delete name;
}

void VariableExpr::accept(Visitor* v){
    v->visitVariableExpr(*this);
}

FunctionNameExpr::FunctionNameExpr(const char *var):VariableExpr(var){

}

FunctionNameExpr::~FunctionNameExpr(){

}

void FunctionNameExpr::accept(Visitor *v){
    v->visitFunctionNameExpr(*this);
}

void BinaryExpr::accept(Visitor* v){
    v->visitBinaryExpr(*this);
}

int BinaryExpr::getOperator(){
    //TODO: remove this
    return 0;
}

void ConstantExpr::accept(Visitor* v){
    v->visitConstantExpr(*this);
}

AddExpr::AddExpr(Tree *l,Tree *r):BinaryExpr(l,r){

}


int AddExpr::getOperator(){
    return OpCodeGen::ADD;
}

MinusExpr::MinusExpr(Tree *l,Tree *r):BinaryExpr(l,r){

}


int MinusExpr::getOperator(){
    return OpCodeGen::SUB;
}

MulExpr::MulExpr(Tree *l,Tree *r):BinaryExpr(l,r){

}



int MulExpr::getOperator(){
    return OpCodeGen::MUL;
}

DivExpr::DivExpr(Tree *l,Tree *r):BinaryExpr(l,r){

}



int DivExpr::getOperator(){
    return OpCodeGen::DIV;
}

